package main

import (
	"chat/config"
	"chat/models"
	"chat/pkg/utils"
	"chat/routes"
	"fmt"
	"log"
	"os"
	"path/filepath"
)

// 检查目录是否包含必需的子目录
func checkRequiredDirs(dir string) bool {
	templatesPath := filepath.Join(dir, "templates")
	staticPath := filepath.Join(dir, "static")

	// 检查目录是否存在
	if _, err := os.Stat(templatesPath); err != nil {
		return false
	}
	if _, err := os.Stat(staticPath); err != nil {
		return false
	}

	// 检查是否包含必需的文件
	if _, err := os.Stat(filepath.Join(templatesPath, "chat.html")); err != nil {
		return false
	}
	if _, err := os.Stat(filepath.Join(staticPath, "js", "chat.js")); err != nil {
		return false
	}

	return true
}

// 获取项目根目录®
func getRootDir() string {
	// 首先尝试获取可执行文件所在目录
	ex, err := os.Executable()
	if err == nil {
		exePath := filepath.Dir(ex)
		log.Printf("检查可执行文件目录: %s", exePath)
		if checkRequiredDirs(exePath) {
			log.Printf("在可执行文件目录找到必需的文件")
			return exePath
		}
	}

	// 获取当前工作目录
	cwd, err := os.Getwd()
	if err != nil {
		log.Fatal("获取当前工作目录失败:", err)
	}
	log.Printf("检查当前工作目录: %s", cwd)

	// 检查当前目录
	if checkRequiredDirs(cwd) {
		log.Printf("在当前工作目录找到必需的文件")
		return cwd
	}

	// 检查上级目录（用于本地开发环境）
	parentDir := filepath.Dir(cwd)
	log.Printf("检查上级目录: %s", parentDir)
	if checkRequiredDirs(parentDir) {
		log.Printf("在上级目录找到必需的文件")
		return parentDir
	}

	// 如果都没找到，使用当前目录
	log.Printf("警告: 未找到必需的目录，使用当前目录: %s", cwd)
	return cwd
}

func main() {
	rootDir := getRootDir()
	log.Printf("使用的根目录: %s", rootDir)

	// 初始化配置
	config.InitConfig()

	// 初始化数据库连接
	if err := utils.InitDB(); err != nil {
		log.Fatalf("数据库连接失败: %v", err)
	}

	// 自动迁移数据库表
	if err := utils.DB.AutoMigrate(&models.User{}, &models.Message{}); err != nil {
		log.Fatalf("数据库迁移失败: %v", err)
	}

	// 设置路由
	r := routes.SetupRouter(rootDir)

	// 启动服务器
	fmt.Println("服务器启动在 :8088 端口")
	if err := r.Run(":8088"); err != nil {
		log.Fatalf("服务器启动失败: %v", err)
	}
}
